/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
*/

package com.jinhe.tss.cms.dao;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.jinhe.tss.cms.entity.Article;
import com.jinhe.tss.cms.entity.Attachment;
import com.jinhe.tss.cms.entity.ChannelArticle;
import com.jinhe.tss.cms.helper.ArticleQueryCondition;
import com.jinhe.tss.component.support.persistence.pagequery.PageInfo;
import com.jinhe.tss.core.persistence.IDao;

/** 
 * Article的Dao层接口，定义所有Article相关的数据库操作接口
 */
public interface IArticleDao extends IDao<Article> {
 
    /**
     * <p>
     *  根据栏目id获取发布成xml文件(真实发布状态)的文章列表
     * </p>
     * @param channelId
     * @return
     */
    List<?> getPublishedArticleByChannel(Long channelId);

	/**
	 * <p>
	 * 获取栏目文章关联表中选中栏目ID的最大序号
	 * </p>
	 * @param channelId
	 * @return
	 */
	Integer getChannelArticleNextOrder(Long channelId);

	/**
	 * <p>
	 * 根据文章ID获取文章附件列表
	 * </p>
	 * @param articleId
	 * @return
	 */
	Map<String, Attachment> getArticleAttachments(Long articleId);

	/**
	 * <p>
	 * 根据栏目ID和文章ID获取栏目文章关系信息
	 * </p>
	 * @param condition
	 * @return
	 */
	ChannelArticle getChannelArticle(Long articleId, Long channelId);

    /**
     * <p>
     * 根据文章ID获取此文章附件最大的序号
     * </p>
     * @param id
     * @return
     */
    Integer getAttachmentNextOrder(Long id);
 
    /**
     * <p>
     *  通过文章id获取栏目ID
     * </p>
     * @param articleId
     * @return
     */
    Long getChannelIdByArticleId(Long articleId);

    /**
     * <p>
     * 通过文章id获得其相关文章的List列表
     * </p>
     * @param articleId
     * @return
     */
    List<?> getArticleLationsById(Long articleId);
    
    /**
     * <p>
     * 	通过文章id获得相关文章关系列表
     * </p>
     * @param articleId
     * @return
     */
    List<?> getLationsById(Long articleId);
    
    /**
     * <p>
     *  获得文章的相关文章的最大序号
     * </p>
     * @param articleId
     * @return
     */
    Integer getArticleLationNextOrder(Long articleId);
    
    /**
     * <p>
     *  通过文章ID获得所有分发到该文章的栏目列表
     * </p>
     * @param articleId
     * @return
     */
    List<?> getDispathedToChannels(Long articleId);
        
    /**
     * <p>
     *  通过文章id获得所有的栏目文章关系表中分发文章关系的列表
     * </p>
     * @param articleId
     * @return
     */
    List<?> getFFChannelArticleListByArticle(Long articleId);
    
    /**
     * <p>
     *  通过栏目id和文章id获得所有的栏目文章关系表中转载文章关系的列表
     * </p>
     * @param ArticleId
     * @param channelId
     * @return
     */
    List<?> getZZChannelArticleList(Long articleId,Long channelId);
    
    /**
     * <p>
     *  获得栏目的文章列表
     * </p>
     * @param channelId
     * @param pageNum
     * @param orderBy
     * @return
     */
    PageInfo getPageList(Long channelId, Integer pageNum, String...orderBy);
 
    /**
     * <p>
     *  条件搜索栏目及其子栏目的文章列表
     * </p>
     * @param condition
     * @return
     */
    PageInfo getSearchArticlePageList(ArticleQueryCondition condition);
 
    /**
     * <p>
     *  获取栏目的分页文章列表，Portlet远程调用时使用
     * </p>
     * @param condition
     * @return
     */
    PageInfo getChannelPageArticleList(ArticleQueryCondition condition);
    
    /**
     * 根据栏目ids，获取这些栏目下的所有文章列表
     * @param condition
     * @param isArchives
     * @return
     */
    PageInfo getArticlesByChannelIds(ArticleQueryCondition condition);
    
    /**
     * 获取已发布成xml文件的相关文章列表 
     * @param articleId
     * @return
     * @see getArticleLationsById(Long articleId)
     */
    List<?> getRelationArticles(Long articleId);

    /**
     * <p>
     *  根据权限项ID(operationId)查找用户对该流程步骤是否有权限
     * </p>
     * @param operationId 权限项目ID
     * @param resourceId  流程步骤ID
     * @return
     */
    boolean checkArticleWorkflowPermission(String operationId, Long resourceId);
    
    /**
     * 本方法与Article getEntity()一致，都是读取文章，不同的是fetch不会被动态属性拦截器拦截，
     * 适合修改单个文章属性的保存操作，像发布文章时修改文章的发布的路径，如此可提高性能。
     * @param id
     * @return
     */
    Article fetchArticleById(Long id);
    
    /**
     * <p>动态属性save方法</p>
     * @param article
     * @return
     */
    Article saveArticle(Article article);
    
    /**
     * 本方法与上面saveArticle一致，都是保存文章，不同的是renew不会被动态属性拦截器拦截，
     * 适合修改单个文章属性的保存操作，像发布文章时修改文章的发布的路径，如此可提高性能。
     * @param article
     * @return
     */
    Article renewArticle(Article article);
    
    /**
     * <p>
     * 物理删除文章信息
     * </p>
     * @param article
     */
    void deleteArticle(Article article);
    
    /**
     * <p>
     * 获取过期文章列表。
     * 比较过期时间是早于当前时间，以及文章是否为”已发布“状态。其他状态没必要设置为过期。
     * </p>
     * @param now
     * @param channelId
     * @return
     */
    List<Article> getExpireArticlePuburlList(Date now, Long channelId);
}